/**
 * @overview 这是一个画图的抽象类，定义了基本的画图接口方法。
 * @component#iChart.Painter
 * @extend#iChart.Element
 */
iChart.Painter = iChart.extend(iChart.Element, {

	configure : function() {
		/**
		 * indicate the element's type
		 */
		this.type = 'painter';

		this.dimension = iChart._2D;

		/**
		 * define abstract method
		 */
		iChart.DefineAbstract('commonDraw', this);
		iChart.DefineAbstract('initialize', this);

		this.set({
			/**
			 * @cfg {String} 组件中context的strokeStyle属性的值。(默认为'gray')
			 */
			strokeStyle : 'gray',
			/**
			 * @cfg {Number} 组件中内边框的值,规则与css中的一致，单位像素。(默认为10)
			 */
			padding : 10,
			/**
			 * @cfg {String} 组件中字体颜色的值。(默认为'black')
			 */
			color : 'black',
			/**
			 * @cfg {Number} 组件中水平偏移量，正数向右，负数向左。单位像素。(默认为0)
			 */
			offsetx : 0,
			/**
			 * @cfg {Number} 组件中垂直偏移量，正数向下，负数向上。单位像素。(默认为0)
			 */
			offsety : 0,
			/**
			 * @cfg {String} 组件中背景颜色(填充色)的值。(默认为'FEFEFE')
			 */
			background_color : '#FEFEFE',
			/**
			 * @cfg {float(0.01 - 0.5)} 颜色因子，指示其颜色相对于背景色的变化量,值越大，变化值越大(越亮或者越暗)(默认为0.15)
			 */
			color_factor : 0.15,
			/**
			 * @cfg {Boolean} True表示开启渐变效果.(默认为false)
			 */
			gradient : false,
			/**
			 * @cfg {String} 背景渐变的样式。(默认为'LinearGradientUpDown')
			 * @Option 'LinearGradientUpDown'
			 * @Option 'LinearGradientDownUp'
			 * @Option 'LinearGradientLeftRight'
			 * @Option 'LinearGradientRightLeft'
			 * @Option 'RadialGradientOutIn'
			 * @Option 'RadialGradientInOut'
			 */
			gradient_mode:'LinearGradientUpDown',
			/**
			 * @inner {String} ('2d','3d')
			 */
			style : '',
			/**
			 * @cfg {Object} 此处设置了开启边框配置项。
			 */
			border : {
				enable : true
			},
			/**
			 * @cfg {Number}组件渲染的顺序，值越大，越靠后渲染，意味着显示在最上层。(默认为 0)
			 */
			z_index:0,
			/**
			 * @cfg {Object} 事件的配置项。(默认为null)
			 */
			listeners : null,
			/**
			 * @inner {Number} inner use
			 */
			originx : 0,
			/**
			 * @inner {Number} inner use
			 */
			originy : 0
		});

		this.variable.event = {
			mouseover : false
		};
		
		
		/**
		 * register the common event
		 */
		this.registerEvent(
		/**
		 * @event 点击时触发。
		 * @paramter iChart.Painter#this
		 * @paramter EventObject#e 鼠标事件对象
		 * @paramter Object#param 额外的参数
		 */
		'click',
		/**
		 * @event 鼠标移动时触发。
		 * @paramter iChart.Painter#this
		 * @paramter EventObject#e 鼠标事件对象
		 */
		'mousemove',
		/**
		 * @event 鼠标在进入时触发。
		 * @paramter iChart.Painter#this
		 * @paramter EventObject#e 鼠标事件对象
		 */
		'mouseover',
		/**
		 * @event 鼠标在离开时触发。
		 * @paramter iChart.Painter#this
		 * @paramter EventObject#e 鼠标事件对象
		 */
		'mouseout',
		/**
		 * @event 绘图之前触发，返回false停止绘图行为。
		 * @paramter iChart.Painter#this
		 */
		'beforedraw',
		/**
		 * @event 完成绘图之后触发。
		 * @paramter iChart.Painter#this
		 */
		'draw');

	},
	is3D : function() {
		return this.dimension == iChart._3D;
	},
	/**
	 * @method 绘图方法接口，这是一个抽象模板方法。实现此方法之后定义自己的行为。目前为止,<link>iChart.Chart</link> 和 <link>iChart.Component</link> 实现了此方法.
	 * @return void
	 */
	draw : function(o) {
		this.init();
		this.draw = function(o){
			/**
			 * fire the beforedraw event
			 */
			if (!this.fireEvent(this, 'beforedraw', [this])) {
				return this;
			}
			/**
			 * execute the commonDraw() that the subClass implement
			 */
			this.commonDraw(o);

			/**
			 * fire the draw event
			 */
			this.fireEvent(this, 'draw', [this]);
		}
		this.draw(o);
	},
	fireString : function(socpe, name, args, s) {
		var t = this.fireEvent(socpe, name, args);
		return iChart.isString(t) ? t : s;
	},
	fireEvent : function(socpe, name, args) {
		var L = this.events[name].length;
		if (L == 1)
			return this.events[name][0].apply(socpe, args);
		var r = true;
		for ( var i = 0; i < L; i++) {
			r = this.events[name][i].apply(socpe, args);
		}
		return r;
	},
	on : function(name, fn) {
		if (iChart.isString(name) && iChart.isFunction(fn))
			if(!this.events[name]){
				console.log(name);
			}
			this.events[name].push(fn);
		return this;
	},
	doConfig : function() {
		var padding = iChart.parsePadding(this.get('padding')), bg = this.get('background_color'), f = this.get('color_factor');
		this.push('padding_top', padding[0]);
		this.push('padding_right', padding[1]);
		this.push('padding_bottom', padding[2]);
		this.push('padding_left', padding[3]);
		this.push('hpadding', padding[1] + padding[3]);
		this.push('vpadding', padding[0] + padding[2]);
		this.push('fontStyle', iChart.getFont(this.get('fontweight'), this.get('fontsize'), this.get('font')));
		this.push('fill_color', bg);
		this.push("light_color", iChart.light(bg, f));
		this.push("dark_color", iChart.dark(bg, f));
		this.push("light_color2", iChart.light(bg, f * 2));
		this.push("dark_color2", iChart.dark(bg, f) * 2);
		this.id = this.get('id');

	}
});//@end
